#include "stdafx.h"
#include "MainWindowT.h"            // 包含主窗口头文件
#include "FileOrganizerT.h"           // 包含文件整理器头文件
#include <QApplication>              // 包含QApplication类
#include <QMenuBar>                  // 包含菜单栏类
#include <QStatusBar>                // 包含状态栏类
#include <QMessageBox>               // 包含消息框类
#include <QFileDialog>               // 包含文件对话框类
#include <QDesktopServices>          // 包含桌面服务类
#include <QHeaderView>               // 包含表头视图类
#include <QProgressDialog>           // 包含进度对话框类

MainWindow::MainWindow(QWidget* parent)
    : QMainWindow(parent)            // 调用父类构造函数
    , fileOrganizer(new FileOrganizer(this))  // 初始化文件整理器
{
    setupUI();                       // 设置用户界面
    createMenuBar();                 // 创建菜单栏
    createStatusBar();               // 创建状态栏

    // 连接文件整理器的信号到主窗口的槽
    connect(fileOrganizer, &FileOrganizer::progressUpdated,
        this, &MainWindow::onProgressUpdated);
    connect(fileOrganizer, &FileOrganizer::operationFinished,
        this, &MainWindow::onOperationFinished);

    // 设置窗口标题和大小
    setWindowTitle("桌面文件整理工具");  // 设置窗口标题
    setMinimumSize(800, 600);        // 设置最小窗口大小
    resize(1000, 700);               // 设置初始窗口大小
}

MainWindow::~MainWindow()
{
    // 析构函数，Qt的智能指针会自动管理内存
}

void MainWindow::setupUI()
{
    // 创建中央部件
    QWidget* centralWidget = new QWidget(this);  // 创建中央部件
    setCentralWidget(centralWidget);             // 设置为主窗口的中央部件

    // 创建主布局
    QVBoxLayout* mainLayout = new QVBoxLayout(centralWidget);  // 创建垂直主布局

    // 创建统计信息区域
    QHBoxLayout* statsLayout = new QHBoxLayout();  // 创建水平统计布局
    countLabel = new QLabel("文件数量: 0", this);  // 创建文件数量标签
    sizeLabel = new QLabel("总大小: 0 KB", this);  // 创建文件大小标签
    statsLayout->addWidget(countLabel);            // 添加数量标签到布局
    statsLayout->addWidget(sizeLabel);             // 添加大小标签到布局
    statsLayout->addStretch();                     // 添加弹性空间
    mainLayout->addLayout(statsLayout);            // 添加统计布局到主布局

    // 创建文件表格
    fileTable = new QTableWidget(this);            // 创建表格控件
    fileTable->setColumnCount(5);                  // 设置5列
    fileTable->setHorizontalHeaderLabels(          // 设置表头标签
        QStringList() << "文件名" << "类型" << "大小" << "扩展名" << "修改时间");
    fileTable->setSelectionBehavior(QAbstractItemView::SelectRows);  // 设置选择行为为整行选择
    fileTable->setEditTriggers(QAbstractItemView::NoEditTriggers);   // 设置不可编辑
    fileTable->setSortingEnabled(true);            // 启用排序
    fileTable->setAlternatingRowColors(true);      // 设置交替行颜色
    fileTable->horizontalHeader()->setStretchLastSection(true);  // 最后一列拉伸填充

    // 设置列宽
    fileTable->setColumnWidth(0, 250);  // 文件名列宽
    fileTable->setColumnWidth(1, 100);  // 类型列宽
    fileTable->setColumnWidth(2, 100);  // 大小列宽
    fileTable->setColumnWidth(3, 80);   // 扩展名列宽

    mainLayout->addWidget(fileTable);   // 添加表格到主布局

    // 创建进度条
    progressBar = new QProgressBar(this);  // 创建进度条
    progressBar->setVisible(false);        // 初始隐藏进度条
    mainLayout->addWidget(progressBar);    // 添加进度条到主布局

    // 创建状态标签
    statusLabel = new QLabel("准备就绪", this);  // 创建状态标签
    mainLayout->addWidget(statusLabel);          // 添加状态标签到主布局

    // 创建按钮布局
    QHBoxLayout* buttonLayout = new QHBoxLayout();  // 创建水平按钮布局
    scanButton = new QPushButton("扫描桌面文件", this);      // 创建扫描按钮
    organizeButton = new QPushButton("整理文件", this);      // 创建整理按钮
    moveFilesButton = new QPushButton("移动文件到分类文件夹", this);  // 创建移动按钮

    buttonLayout->addWidget(scanButton);          // 添加扫描按钮到布局
    buttonLayout->addWidget(organizeButton);      // 添加整理按钮到布局
    buttonLayout->addWidget(moveFilesButton);     // 添加移动按钮到布局
    buttonLayout->addStretch();                   // 添加弹性空间

    mainLayout->addLayout(buttonLayout);          // 添加按钮布局到主布局

    // 连接按钮信号到槽函数
    connect(scanButton, &QPushButton::clicked, this, &MainWindow::onScanClicked);
    connect(organizeButton, &QPushButton::clicked, this, &MainWindow::onOrganizeClicked);
    connect(moveFilesButton, &QPushButton::clicked, this, &MainWindow::onMoveFilesClicked);
    connect(fileTable, &QTableWidget::itemSelectionChanged,
        this, &MainWindow::onTableItemSelectionChanged);

    // 初始禁用整理和移动按钮
    organizeButton->setEnabled(false);
    moveFilesButton->setEnabled(false);
}

void MainWindow::createMenuBar()
{
    QMenuBar* menuBar = this->menuBar();  // 获取菜单栏

    // 创建文件菜单
    QMenu* fileMenu = menuBar->addMenu("文件");  // 添加文件菜单

    QAction* scanAction = new QAction("扫描文件", this);  // 创建扫描动作
    QAction* exitAction = new QAction("退出", this);      // 创建退出动作

    fileMenu->addAction(scanAction);      // 添加扫描动作到菜单
    fileMenu->addSeparator();             // 添加分隔符
    fileMenu->addAction(exitAction);      // 添加退出动作到菜单

    // 连接菜单动作信号
    connect(scanAction, &QAction::triggered, this, &MainWindow::onScanClicked);
    connect(exitAction, &QAction::triggered, this, &QWidget::close);

    // 创建帮助菜单
    QMenu* helpMenu = menuBar->addMenu("帮助");  // 添加帮助菜单

    QAction* aboutAction = new QAction("关于", this);  // 创建关于动作
    helpMenu->addAction(aboutAction);     // 添加关于动作到菜单

    connect(aboutAction, &QAction::triggered, this, []() {
        QMessageBox::about(nullptr, "关于",  // 弹出关于对话框
            "桌面文件整理工具\n\n"
            "功能：\n"
            "• 扫描桌面文件\n"
            "• 按类型整理文件\n"
            "• 自动创建分类文件夹\n"
            "• 移动文件到对应分类");
        });
}

void MainWindow::createStatusBar()
{
    statusBar()->showMessage("就绪");  // 在状态栏显示初始消息
}

void MainWindow::onScanClicked()
{
    statusLabel->setText("正在扫描桌面文件...");  // 更新状态标签
    progressBar->setVisible(true);                // 显示进度条
    progressBar->setRange(0, 0);                  // 设置进度条为忙碌状态

    scanButton->setEnabled(false);    // 禁用扫描按钮
    organizeButton->setEnabled(false);  // 禁用整理按钮
    moveFilesButton->setEnabled(false); // 禁用移动按钮

    fileOrganizer->scanDesktopFiles();  // 调用扫描方法
}

void MainWindow::onOrganizeClicked()
{
    statusLabel->setText("正在整理文件...");  // 更新状态标签
    fileOrganizer->organizeByType();      // 调用整理方法
    updateStatistics();                   // 更新统计信息
}

void MainWindow::onMoveFilesClicked()
{
    // 确认对话框
    QMessageBox::StandardButton reply = QMessageBox::question(this,
        "确认移动",
        "确定要将文件移动到分类文件夹吗？此操作不可撤销。",
        QMessageBox::Yes | QMessageBox::No);

    if (reply == QMessageBox::Yes) {  // 用户确认移动
        statusLabel->setText("正在移动文件...");  // 更新状态标签
        progressBar->setVisible(true);            // 显示进度条
        progressBar->setRange(0, 100);            // 设置进度范围

        scanButton->setEnabled(false);    // 禁用按钮
        organizeButton->setEnabled(false);
        moveFilesButton->setEnabled(false);

        fileOrganizer->moveFilesToCategories();  // 调用移动方法
    }
}

void MainWindow::onTableItemSelectionChanged()
{
    // 当选择变化时更新界面状态
    bool hasSelection = !fileTable->selectedItems().isEmpty();  // 检查是否有选择
    // 可以在这里添加选择相关功能
}

void MainWindow::onProgressUpdated(int value, const QString& message)
{
    progressBar->setValue(value);        // 更新进度条值
    statusLabel->setText(message);       // 更新状态文本
    statusBar()->showMessage(message);   // 更新状态栏消息

    QApplication::processEvents();       // 处理事件，确保UI更新
}

void MainWindow::onOperationFinished()
{
    // 更新文件表格
    fileTable->setRowCount(0);  // 清空表格

    const QList<FileInfo>& files = fileOrganizer->getFileList();  // 获取文件列表
    for (int i = 0; i < files.size(); ++i) {  // 遍历文件列表
        const FileInfo& file = files[i];      // 获取文件信息

        fileTable->insertRow(i);  // 插入新行

        // 创建表格项并添加到表格
        fileTable->setItem(i, 0, new QTableWidgetItem(file.name));
        fileTable->setItem(i, 1, new QTableWidgetItem(file.category));
        fileTable->setItem(i, 2, new QTableWidgetItem(file.sizeString));
        fileTable->setItem(i, 3, new QTableWidgetItem(file.extension));
        fileTable->setItem(i, 4, new QTableWidgetItem(file.lastModified));
    }

    updateStatistics();  // 更新统计信息

    // 恢复界面状态
    progressBar->setVisible(false);  // 隐藏进度条
    scanButton->setEnabled(true);    // 启用扫描按钮
    organizeButton->setEnabled(true);  // 启用整理按钮
    moveFilesButton->setEnabled(true); // 启用移动按钮

    statusLabel->setText("操作完成");  // 更新状态标签
    statusBar()->showMessage("操作完成");  // 更新状态栏
}

void MainWindow::updateStatistics()
{
    // 更新统计信息显示
    int fileCount = fileOrganizer->getFileList().size();  // 获取文件数量
    qint64 totalSize = fileOrganizer->getTotalSize();     // 获取总大小

    countLabel->setText(QString("文件数量: %1").arg(fileCount));  // 更新数量标签

    // 格式化大小显示
    QString sizeText;
    if (totalSize < 1024) {
        sizeText = QString("%1 B").arg(totalSize);
    }
    else if (totalSize < 1024 * 1024) {
        sizeText = QString("%1 KB").arg(totalSize / 1024.0, 0, 'f', 1);
    }
    else {
        sizeText = QString("%1 MB").arg(totalSize / (1024.0 * 1024.0), 0, 'f', 1);
    }

    sizeLabel->setText(QString("总大小: %1").arg(sizeText));  // 更新大小标签
}